提醒:由於看到這系列鐵人訂閱人數漸漸變多,標記一下這些內容是在「非常萌新時期」所寫,更多技術內容請參考我的 Github,歡迎跟我一起討論 ^ ^
前面完成的部分,已經讓使用者可以瀏覽閱讀網站上的資訊了。接下來將繼續完成 更新資料 的部分。這個部分主要是讓使用者透過 HTML form 來提交資料。
POST
來發送資料,因此也相對安全,可保護其不會受到 cross-site request forgery 的威脅。type
:可指定輸入內容的類型。name
:可想像這個 form 提交後,會將所有資料做成一個 object,而 name 就是對照這 input 輸入的資料的名稱。value
:輸入框中顯示的預設內容。<label>
:藉由 for
與特定ID的 <input>
綁在一起,一般可當作其標題。(如點選label,可自動跳轉到input)submit
:提交整個 form 輸入的資料給 server。action
:資料提交的目的地。(若填空的,則提交到當前頁面URL)method
:HTTP request 的方式。
POST
:用於更改server的資料。(安全性較高)GET
:只用在不需更改資料的地方。<form action="/提交資料到此_url/" method="post">
<label for="對應的ID">標題: </label>
<input id="對應的ID" type="text" name="資料的名稱" value="預設顯示內容">
<input type="submit" value="提交按鈕上的文字">
</form>
npm install express-validator --save
進行安裝。body(fields[, message])
:用以檢查資料是否符合規定。name
', '錯誤時回傳的訊息').檢查的條件)// 檢查條件可設定單個:(是否大於一個字元)
body('name', 'Empty name').isLength({ min: 1 }),
// 檢查條件可設定多個:(null & empty略過)+(是否符合正規日期 )
body('age', 'Invalid age').optional({ checkFalsy: true }).isISO8601(),
// 也可以一對一配對 條件&錯誤訊息
body('name').isLength({ min: 1 }).trim().withMessage('Name empty.').isAlpha().withMessage('Name must be alphabet letters.'),
sanitizeBody(fields)
:用以清理資料。name
').清理的動作)// 移除 HTML 字元,以避免 JavaScript cross-site scripting attacks
sanitizeBody('name').trim().escape(),
// 將其轉為日期格式
sanitizeBody('date').toDate(),
validationResult(req)
:檢查是否有經由以上 validator 抓到的錯誤。
isEmpty()
以查看 errors 是否為空,來判斷是否有錯誤存在。errors.array()
將錯誤訊息包成 array 回傳。(req, res, next) => {
const errors = validationResult(req)
if (!errors.isEmpty()) {
} else { }
}
在此專案中,存在著許多互相關聯的 model(如書本中有作者資訊),因此設計更新資料中,此案例的 form 遵循兩個規則: